using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._GeoAnalyticsDesktopTools._SummarizeData
{
    /// <summary>
    /// <para>Summarize Center And Dispersion</para>
    /// <para>Finds central features and directional distributions and calculates mean and median locations from the input.</para>
    /// <para>查找中心要素和方向分布，并根据输入计算平均值和中位数位置。</para>
    /// </summary>    
    [DisplayName("Summarize Center And Dispersion")]
    public class SummarizeCenterAndDispersion : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public SummarizeCenterAndDispersion()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_input_layer">
        /// <para>Input Layer</para>
        /// <para>The point, line, or polygon layer to be summarized.</para>
        /// <para>要汇总的点、线或面图层。</para>
        /// </param>
        public SummarizeCenterAndDispersion(object _input_layer)
        {
            this._input_layer = _input_layer;
        }
        public override string ToolboxName => "GeoAnalytics Desktop Tools";

        public override string ToolName => "Summarize Center And Dispersion";

        public override string CallName => "gapro.SummarizeCenterAndDispersion";

        public override List<string> AcceptEnvironments => ["extent", "outputCoordinateSystem", "parallelProcessingFactor", "workspace"];

        public override object[] ParameterInfo => [_input_layer, _out_central_feature, _out_mean_center, _out_median_center, _out_ellipse, _ellipse_size.GetGPValue(), _weight_field, _group_by_field];

        /// <summary>
        /// <para>Input Layer</para>
        /// <para>The point, line, or polygon layer to be summarized.</para>
        /// <para>要汇总的点、线或面图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _input_layer { get; set; }


        /// <summary>
        /// <para>Output Central Feature</para>
        /// <para>The output feature class that will contain the most centrally located feature in the input layer.</para>
        /// <para>将包含输入图层中位置最集中的要素的输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Central Feature")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_central_feature { get; set; } = null;


        /// <summary>
        /// <para>Output Mean Center</para>
        /// <para>The output point feature class that will contain features representing the mean centers of the input layer.</para>
        /// <para>输出点要素类，该要素类将包含表示输入图层平均中心的要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Mean Center")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_mean_center { get; set; } = null;


        /// <summary>
        /// <para>Output Median Center</para>
        /// <para>The output point feature class that will contain features representing the median centers of the input layer.</para>
        /// <para>输出点要素类，该要素类将包含表示输入图层中位中心的要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Median Center")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_median_center { get; set; } = null;


        /// <summary>
        /// <para>Output Ellipse</para>
        /// <para>The output polygon feature class that will contain the directional ellipse representation of the input layer.</para>
        /// <para>输出面要素类，将包含输入图层的方向椭圆表示。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Ellipse")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_ellipse { get; set; } = null;


        /// <summary>
        /// <para>Ellipse Size</para>
        /// <para><xdoc>
        ///   <para>Specifies the size of output ellipses in standard deviations.</para>
        ///   <bulletList>
        ///     <bullet_item>One standard deviation—Output ellipses will cover one standard deviation of the input features. This is the default.</bullet_item><para/>
        ///     <bullet_item>Two standard deviations—Output ellipses will cover two standard deviations of the input features.</bullet_item><para/>
        ///     <bullet_item>Three standard deviations—Output ellipses will cover three standard deviations of the input features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定以标准差为单位的输出椭圆的大小。</para>
        ///   <bulletList>
        ///     <bullet_item>一个标准差—输出椭圆将覆盖输入要素的一个标准差。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>两个标准差—输出椭圆将涵盖输入要素的两个标准差。</bullet_item><para/>
        ///     <bullet_item>三个标准差—输出椭圆将涵盖输入要素的三个标准差。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Ellipse Size")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _ellipse_size_value _ellipse_size { get; set; } = _ellipse_size_value._1_STANDARD_DEVIATION;

        public enum _ellipse_size_value
        {
            /// <summary>
            /// <para>One standard deviation</para>
            /// <para>One standard deviation—Output ellipses will cover one standard deviation of the input features. This is the default.</para>
            /// <para>一个标准差—输出椭圆将覆盖输入要素的一个标准差。这是默认设置。</para>
            /// </summary>
            [Description("One standard deviation")]
            [GPEnumValue("1_STANDARD_DEVIATION")]
            _1_STANDARD_DEVIATION,

            /// <summary>
            /// <para>Two standard deviations</para>
            /// <para>Two standard deviations—Output ellipses will cover two standard deviations of the input features.</para>
            /// <para>两个标准差—输出椭圆将涵盖输入要素的两个标准差。</para>
            /// </summary>
            [Description("Two standard deviations")]
            [GPEnumValue("2_STANDARD_DEVIATIONS")]
            _2_STANDARD_DEVIATIONS,

            /// <summary>
            /// <para>Three standard deviations</para>
            /// <para>Three standard deviations—Output ellipses will cover three standard deviations of the input features.</para>
            /// <para>三个标准差—输出椭圆将涵盖输入要素的三个标准差。</para>
            /// </summary>
            [Description("Three standard deviations")]
            [GPEnumValue("3_STANDARD_DEVIATIONS")]
            _3_STANDARD_DEVIATIONS,

        }

        /// <summary>
        /// <para>Weight Field</para>
        /// <para>A numeric field used to weight locations according to their relative importance. This applies to all summary types.</para>
        /// <para>一个数值字段，用于根据位置的相对重要性对位置进行加权。这适用于所有摘要类型。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Weight Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _weight_field { get; set; } = null;


        /// <summary>
        /// <para>Group By Field</para>
        /// <para>The field used to group similar features. This applies to all summary types. For example, if you choose a field named PlantType that contains values of tree, bush, and grass, all of the features with the value tree will be analyzed for their own center or dispersion. This example will result in three features, one for each group of tree, bush, and grass.</para>
        /// <para>用于对相似要素进行分组的字段。这适用于所有摘要类型。例如，如果选择名为 PlantType 的字段，其中包含 tree、bush 和 grass 的值，则将分析具有值树的所有要素的中心或离散。此示例将生成三个要素，每组树、灌木和草各一个要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Group By Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _group_by_field { get; set; } = null;


        public SummarizeCenterAndDispersion SetEnv(object extent = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object workspace = null)
        {
            base.SetEnv(extent: extent, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, workspace: workspace);
            return this;
        }

    }

}